with Ada.Strings.Unbounded;
use Ada.Strings.Unbounded;

package CLAP.Types is

   type U_String is new Unbounded_String;
   type U_String_Reference is access all U_String'Class;
   type U_String_View is access constant U_String'Class;

   type Character_Reference is access all Character'Class;
   type Character_View is access constant Character'Class;

   type Natural_Reference is access all Natural'Class;
   type Natural_View is access constant Natural'Class;

   Empty_U_String : constant U_String := "";

   type ErrorMessage_Type is new U_String;
   type Error_Type is ( eunkopt );
   type Size_Type is new Positive;

   type String_Array is array ( Positive range <> ) of String;
   type String_Array_Reference is access all String_Array'Class;
   type String_Array_View is access constant String_Array'Class;

   type String_Switch_Map is new Map ( Key_Type => U_String,
                                       Element_Type => Switch_Reference );
   type String_Switch_Map_Reference is access all String_Switch_Map'Class;
   type String_Switch_Map_View is access constant CLI'Class;

   type Character_Switch_Map is new Map ( Key_Type => Character,
                                          Element_Type => Switch_Reference );
   type Character_Switch_Map_Reference is access all String_Switch_Map'Class;
   type Character_Switch_Map_View is access constant CLI'Class;

   type String_Sub_Command_Map is new Map ( Key_Type => U_String,
                                            Element_Type => Sub_Command_Reference );
   type String_Sub_Command_Map_Reference is access all String_Switch_Map'Class;
   type String_Sub_Command_Map_View is access constant CLI'Class;

end CLAP.Types;
